package work.base.data.queue;

import java.util.concurrent.LinkedBlockingDeque;


/**
 * LinkedBlockingDeque双向阻塞队列
 */
public class LinkedBlockingDequeExample {
    public static void main(String[] args) {
        // 创建一个容量为 3 的 LinkedBlockingDeque
        LinkedBlockingDeque<String> deque = new LinkedBlockingDeque<>(3);

        try {
            // 向队列尾部添加元素（阻塞方法）
            deque.put("元素1");
            deque.put("元素2");
            System.out.println("队列当前元素: " + deque);

            // 向队列头部添加元素
            deque.putFirst("元素0");
            System.out.println("队列当前元素: " + deque);

            // 尝试向已满的队列添加元素（会阻塞）
            Thread producer = new Thread(() -> {
                try {
                    System.out.println("生产者尝试添加元素4...");
                    deque.put("元素4");
                    System.out.println("生产者成功添加元素4");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
            producer.start();

            // 让主线程休眠 2 秒，模拟处理时间
            Thread.sleep(2000);

            // 从队列头部移除元素（阻塞方法）
            String element = deque.take();
            System.out.println("从队列头部移除: " + element);
            System.out.println("队列当前元素: " + deque);

            // 等待生产者线程完成
            producer.join();

            // 从队列尾部移除元素
            element = deque.takeLast();
            System.out.println("从队列尾部移除: " + element);
            System.out.println("队列当前元素: " + deque);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

